package daoyu.apps.pojo.login;

import daoyu.apps.config.Config;
import daoyu.common.exception.InvalidParameterException;
import daoyu.common.result.AjaxResult;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 小程序登录参数构造器
 */
@Component
@RequiredArgsConstructor(onConstructor_ = @Autowired)
public class LoginBuilder {

    private final @NonNull Config config;

    /**
     * 构造小程序登录请求参数对象
     *
     * @param code 登录临时凭证 code
     * @return 构造好的 AppsLoginReqDTO 对象
     * @throws InvalidParameterException 如果 code 为空或无效
     */
    public LoginReqDTO loginReqDTOBuild(String code) {
        if (code == null || code.trim().isEmpty()) {
            throw new InvalidParameterException("code 不能为空或无效");
        }
        String appid = config.getAppid();
        String secret = config.getSecret();
        return new LoginReqDTO(code, appid, secret);
    }

    /**
     * 构造小程序登录响应对象
     *
     * @param appsLoginResponse 登录响应 DTO
     * @return 构造好的 AppsLoginResVO 对象
     */
    public AjaxResult loginResVOBuild(LoginResDTO appsLoginResponse) {
        // 检查 appsLoginResponse 是否为 null
        if (appsLoginResponse == null) {
            return AjaxResult.error(-1, "抖音响应数据为空");
        }

        Integer errNo = appsLoginResponse.getErrNo();
        LoginResCodeEnum appsLoginResCodeEnum = LoginResCodeEnum.fromErrNo(errNo);

        // 检查错误码是否为成功
        if (appsLoginResCodeEnum == null) {
            return AjaxResult.error(-1, "未知错误码");
        }

        if (appsLoginResCodeEnum == LoginResCodeEnum.SUCCESS) {
            // 使用 MapStruct 进行对象映射
            if (appsLoginResponse.getData() != null) {
                LoginResVO appsLoginResVO = LoginResMapper.INSTANCE.toAppsLoginResVO(appsLoginResponse.getData());
                return AjaxResult.success(appsLoginResVO);
            } else {
                return AjaxResult.error(-1, "响应数据为空");
            }
        }
        return AjaxResult.error(appsLoginResCodeEnum.getErrNo(), appsLoginResCodeEnum.getErrTips());
    }




}
